﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Diagnostics;
//Librerias Arquitectura
using Com.Binaria.Core;
using Com.Binaria.Core.Base;
using Com.Binaria.Core.Dto;
using Com.Binaria.Core.Util;
using Com.Binaria.Core.Datos;
using Com.Binaria.Core.Exceptions;
using Com.Binaria.Core.Enumeracion;
//Librerias Proyecto
using Com.Binaria.SISCOB.Funcional.DTO;
using Com.Binaria.SISCOB.DTO;
using Com.Binaria.SISCOB.DAO;

namespace Com.Binaria.SISCOB.Dom
{
/// <summary>
///	clase de sucursal dom
/// </summary>
    public partial class IngresoDom : IIngresoDom
{
        public IDocumentoTransaccionDom iDocumentoTransaccionDom = null;
       
        #region metodos publicos

	
	
    /// <summary>
    /// metodo que permite registrar elementos de tipo sucursal en el sistema
    /// </summary>
    /// <param name="p_Contexto">informacion del contexto</param>
    /// <param name="p_Sucursal">sucursal a registrar (insertar, actualizar o eliminar)</param>
    /// <param name="p_Accion">Accion a realizar</param>
        public IngresoDTO ProbarRegistrar(ContextoDTO p_Contexto, DocumentoTransaccionDTO p_DocTranDTO)
	{
        //Prefijo del Metodo
        const String MPREFIX = " [ProbarRegistrar]";
        //Resultado accion insertar
        List<IngresoDTO> listIngresoResultDTO = null;
        List<DocumentoTransaccionDTO> listDocTranDTO = null;
        //IngresoDTO ingresoResultDTO = null;
        long tot = 0;

        try
        {
            //Registro log de inicio del proceso
            Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Inicio);

            //Valida que exista informacion en el objeto
            AssertNull.notNullOrEmpty(p_DocTranDTO);

            listDocTranDTO = iDocumentoTransaccionDom.BuscarByIngreso(p_Contexto, new DocumentoTransaccionDTO() { FchDocumento = p_DocTranDTO.FchDocumento, Monto = p_DocTranDTO.Monto, IdCuentaCorriente = p_DocTranDTO.IdCuentaCorriente });
            listDocTranDTO = listDocTranDTO.Where(dt => dt.IdEgreso == null && dt.Monto == p_DocTranDTO.Monto).ToList();
            if (listDocTranDTO.Count == 0)
            {

                listIngresoResultDTO = RegistrarIngreso(p_Contexto, new List<IngresoDTO>() { p_DocTranDTO.Ingreso }, EnumRegistrarAccion.Agregar);
                p_DocTranDTO.IdIngreso = listIngresoResultDTO[0].Id;
                p_DocTranDTO.Ingreso = listIngresoResultDTO[0];

                // Conciliar
                if (!p_DocTranDTO.Ingreso.Estado.Equals("RE"))
                {
                    iDocumentoTransaccionDom.Conciliar(p_Contexto, new List<DocumentoTransaccionDTO>() { p_DocTranDTO });
                }

                listDocTranDTO = iDocumentoTransaccionDom.RegistrarDocumentoTransaccion(p_Contexto, new List<DocumentoTransaccionDTO>() { p_DocTranDTO }, EnumRegistrarAccion.Agregar);
                tot += (long)p_DocTranDTO.Monto;
            }
            else
            {
                IngresoDTO inDTO = BuscarIngresoPorId(p_Contexto,listDocTranDTO[0].IdIngreso);
                if (!inDTO.Estado.Equals("CO"))
                {
                    p_DocTranDTO.Ingreso.Id = listDocTranDTO[0].IdIngreso;
                    p_DocTranDTO.Id = listDocTranDTO[0].Id;
                    listIngresoResultDTO = RegistrarIngreso(p_Contexto, new List<IngresoDTO>() { p_DocTranDTO.Ingreso }, EnumRegistrarAccion.Modificar);

                    p_DocTranDTO.IdIngreso = listDocTranDTO[0].IdIngreso;
                    p_DocTranDTO.Glosa = listDocTranDTO[0].Glosa;

                    // Conciliar
                    if (!p_DocTranDTO.Ingreso.Estado.Equals("RE"))
                    {
                        iDocumentoTransaccionDom.Conciliar(p_Contexto, new List<DocumentoTransaccionDTO>() { p_DocTranDTO });
                    }

                    iDocumentoTransaccionDom.RegistrarDocumentoTransaccion(p_Contexto, new List<DocumentoTransaccionDTO>() { p_DocTranDTO }, EnumRegistrarAccion.Modificar);
                    p_DocTranDTO.Ingreso.Id = listDocTranDTO[0].IdIngreso;
                    listDocTranDTO.Add(p_DocTranDTO);
                    //conciliar
                    //if (!p_DocTranDTO.Ingreso.Estado.Equals("RE"))
                    //{
                    //    iDocumentoTransaccionDom.Conciliar(p_Contexto, listDocTranDTO);
                    //}
                }
                else
                {
                    p_DocTranDTO.Ingreso = inDTO;
                }

            }

            //Console.WriteLine("Monto Ingreso : " + tot);
            //Registro log de ejecucion el termino del metodo
            Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Termino);
        }
        catch (ManagerException me)
        {
            throw (me);
        }
        catch (ArquitecturaException ae)
        {
            throw (ae);
        }
        catch (Exception ex)
        {
            //Registro log de ejecucion con problemas
            Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Problemas);
            //Genero error
            throw new ManagerException(Factoria.GetMessage("DOM_ERROR_NO_MANEJADO"), ex);
        }
        return p_DocTranDTO.Ingreso;
    }

        /// <summary>
        /// Metodo que permite buscar los elementos de tipo ingreso existentes
        /// </summary>
        /// <param name="p_Contexto">informacion del contexto</param>
        /// <param name="p_Filtro">informacion de filtrado para realizar la busqueda</param>
        /// <returns>objeto contenedor de la informacion generada por la accion ejecutada</returns>	
        public List<IngresoDTO> BuscarIngresoFiltroPaginado(ContextoDTO p_Contexto, IngresoDTO p_Filtro)
        {
            //Prefijo del Metodo
            const string MPREFIX = " [Buscar(ContextoDTO, IngresoDTO)]";
            //Crea lista de objetos de salida
            List<IngresoDTO> RespuestaBuscar = new List<IngresoDTO>();

            try
            {
                //Registro log de inicio del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Inicio);

                //Valida que exista informacion a insertar
                AssertNull.notNullOrEmpty(p_Filtro);

                //Obtengo la lista de objetos almacenados en la base de datos
                RespuestaBuscar = iIngresoDAO.FindPag(p_Filtro);

                //Registro log de termino OK del proceso
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Ok);
                //Registro log de ejecucion el termino del metodo
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Termino);
            }
            catch (ManagerException me)
            {
                throw (me);
            }
            catch (ArquitecturaException ae)
            {
                throw (ae);
            }
            catch (Exception ex)
            {
                //Registro log de ejecucion con problemas
                Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Problemas);
                //Genero error
                throw new ManagerException(Factoria.GetMessage("DOM_ERROR_NO_MANEJADO"), ex);
            }
            return RespuestaBuscar;
        }


    #endregion metodos publicos

	}//End class SucursalDom
}//End namespace





